#ifndef _ARV_SINT_H
#define _ARV_SINT_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define T_GOAL	1
#define T_MNCS	2
#define T_DECS	3
#define T_PLUS	4
#define T_SUBT	5
#define T_MULT	6
#define T_DIVD	7
#define T_ASSG	8
#define T_CALL	9
#define T_IF	10
#define T_WHLE	11
#define T_AND	12
#define T_OR	13
#define T_NOT	14
#define T_EQ	15
#define T_NEQ	16
#define T_LT	17
#define T_LE	18
#define T_GT	19
#define T_GE	20
#define T_VARD	21
#define T_INT	22
#define T_ID	23
#define T_METD  24
#define T_PRINT 25
#define T_EXTD  26
#define T_TIPO  27
#define T_EXP   28

typedef struct no{
	int rotulo;
	char * nome;
	struct no *op1;
	struct no *op2;
	struct no *op3;
	struct no *op4;
	struct no *proximo;
} No;

No *novoNo();
void ajustaOp1(No *no, No *op);
void ajustaOp2(No *no, No *op);
void ajustaOp3(No *no, No *op);
void ajustaOp4(No *no, No *op);
void ajustaProximo(No *no, No *proximo);
void ajustaNome(No *no, char *nome);
No *novoNoGoal(char *nome);
No *novoNoMainClasse();
No *novoNoDeclaracaoDeClasse();
No *novoNoDeclaracaoDeMetodo();
No *novoNoExpressao();
No *novoNoExtende();
No *novoNoTipo();
No *novoNoMais();
No *novoNoMenos();
No *novoNoMultiplicacao();
No *novoNoDivisao();
No *novoNoAtribuicao();
No *novoNoChamada();
No *novoNoSe();
No *novoNoEnquanto();
No *novoNoE();
No *novoNoOu();
No *novoNoNegacao();
No *novoNoIgual();
No *novoNoDiferente();
No *novoNoMenor();
No *novoNoMenorOuIgual();
No *novoNoMaior();
No *novoNoMaiorOuIgual();
No *novoNoMultiplicacao();
No *novoNoDeclaracaoDeVar();
No *novoNoImprimir();
No *novoNoInteiro();
No *novoNoId();
void mostraArvore(No *arvore, int nivel);
void destroiArvore(No *arvore);

#endif
